package leveldb

import (
	"fmt"

	"github.com/syndtr/goleveldb/leveldb"
	"github.com/syndtr/goleveldb/leveldb/util"
)

// LevelDB 封装 LevelDB 操作
type LevelDB struct {
	db *leveldb.DB
}

// NewLevelDB 创建一个新的 LevelDB 实例
func NewLevelDB(dbPath string) (*LevelDB, error) {
	db, err := leveldb.OpenFile(dbPath, nil)
	if err != nil {
		return nil, fmt.Errorf("打开数据库失败: %v", err)
	}
	return &LevelDB{db: db}, nil
}

// Put 写入数据
func (l *LevelDB) Put(key, value string) error {
	return l.db.Put([]byte(key), []byte(value), nil)
}

// Get 读取数据
func (l *LevelDB) Get(key string) (string, error) {
	data, err := l.db.Get([]byte(key), nil)
	if err != nil {
		return "", fmt.Errorf("读取数据失败: %v", err)
	}
	return string(data), nil
}

// Close 关闭数据库
func (l *LevelDB) Close() error {
	return l.db.Close()
}

// Delete removes a key from the database.
func (d *LevelDB) Delete(key []byte) error {
	return d.db.Delete(key, nil)
}

// Iterate iterates over a range of keys.
func (d *LevelDB) Iterate(start, limit []byte, fn func(key, value []byte) error) error {
	iter := d.db.NewIterator(&util.Range{Start: start, Limit: limit}, nil)
	defer iter.Release()

	for iter.Next() {
		if err := fn(iter.Key(), iter.Value()); err != nil {
			return err
		}
	}
	return iter.Error()
}
